/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.criar;

import br.com.foxinline.enums.*;
import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.*;
import br.com.foxinline.utilitario.Caracteres;
import br.com.foxinline.utilitario.Mensagem;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.context.RequestContext;

/**
 *
 * @author roniere
 */
@ViewScoped
@ManagedBean
public class ManagerCriarProtesto implements Serializable {

    @EJB
    ProtestoServico protestoServico;
    @EJB
    PessoaServico pessoaServico;
    @EJB
    ProtocoloServico protocoloServico;
    @EJB
    ProtocoloItemServico protocoloItemServico;
    @EJB
    SituacaoProtestoServico situacaoProtestoServico;
    @EJB
    EspecieTituloServico especieTituloServico;
    private Protesto protesto;
    private Protocolo protocolo;
    private ProtocoloItem protocoloItem;
    private Pessoa apresentante;
    private Pessoa apresentanteSelecionado;
    private Pessoa apresentantePesquisar;
    private Pessoa apresentanteCadastrar;
    private Pessoa fiador;
    private Pessoa fiadorSelecionado;
    private Pessoa fiadorPesquisar;
    private Pessoa devedor;
    private Pessoa devedorSelecionado;
    private Pessoa devedorPesquisar;
    private Pessoa devedorCadastrar;
    private Endereco endereco;
    private Endereco enderecoDevedor;
    private List<Pessoa> apresentantesPesquisar;
    private List<Pessoa> apresentantes;
    private List<Pessoa> devedoresPesquisar;
    private List<Pessoa> devedores;
    private List<Pessoa> fiadoresPesquisar;
    private List<Pessoa> fiadores;
    private String protestoid;
    private String codigoProtocolo;
    private boolean visualizar;
    private List<SituacaoProtesto> situacoesProtesto;
    private SituacaoProtesto situacaoProtesto;

    @PostConstruct
    public void init() {
        instanciar();
        delegar();
    }

    private void instanciar() {
        this.protocolo = new Protocolo();
        this.protocoloItem = new ProtocoloItem();
        this.protesto = new Protesto();
        this.apresentantes = new ArrayList<Pessoa>();
        this.devedores = new ArrayList<Pessoa>();
        this.fiadores = new ArrayList<Pessoa>();
        instanciarApresentanteCadastrar();
        instanciarApresentantePesquisar();
        instanciarDevedorPesquisar();
        instanciarDevedorCadastrar();
        
        instanciarFiadorPesquisar();


        instanciarApresentanteCadastrar();

    }

    private void delegar() {
        Map<String, String> parametros = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        this.situacaoProtesto = new SituacaoProtesto();
        
        this.protestoid = parametros.get("protestoId");
        
        if (parametros.get("visualizar") != null || parametros.get("acao") != null) {
            visualizar = true;
        }

        if (parametros.get("acao") != null) {
            try {
                situacaoProtesto.setTipoSituacaoProtesto(getPorCodigoTipoSituacaoProtesto(Integer.parseInt(parametros.get("acao"))));
            } catch (Exception e) {
                e.printStackTrace();
                Mensagem.messagemWarn();
            }
        }

        try {
            if (protestoid != null) {
                protesto = protestoServico.pesquisar(Long.parseLong(protestoid));
                codigoProtocolo = "";
                if (protesto != null) {
                    situacoesProtesto = new ArrayList<SituacaoProtesto>();
                    situacoesProtesto = situacaoProtestoServico.situacoesPorProtesto(protesto);

                    if (protesto.getProtocolo() != null) {
                        protocolo = protesto.getProtocolo();
                    }
                    if (protesto.getProtocoloItem() != null) {
                        protocoloItem = protesto.getProtocoloItem();
                    }
                    if (protesto.getCodigoProtocolo() != null) {
                        codigoProtocolo = protesto.getCodigoProtocolo();
                    }
                    if (protesto.getApresentante() != null) {
                        apresentante = protesto.getApresentante();
                        apresentantes.add(apresentante);
                    }
                    if (protesto.getDevedor() != null) {
                        devedores = protesto.getDevedor();
                    }


                }
            }
        } catch (Exception e) {
            Mensagem.messagemError();
        }

    }

    public Pessoa getFiador() {
        return fiador;
    }

    public void setFiador(Pessoa fiador) {
        this.fiador = fiador;
    }

    public Pessoa getFiadorPesquisar() {
        return fiadorPesquisar;
    }

    public void setFiadorPesquisar(Pessoa fiadorPesquisar) {
        this.fiadorPesquisar = fiadorPesquisar;
    }

    public Pessoa getFiadorSelecionado() {
        return fiadorSelecionado;
    }

    public void setFiadorSelecionado(Pessoa fiadorSelecionado) {
        this.fiadorSelecionado = fiadorSelecionado;
    }

    public List<Pessoa> getFiadores() {
        return fiadores;
    }

    public void setFiadores(List<Pessoa> fiadores) {
        this.fiadores = fiadores;
    }

    public List<Pessoa> getFiadoresPesquisar() {
        return fiadoresPesquisar;
    }

    public void setFiadoresPesquisar(List<Pessoa> fiadoresPesquisar) {
        this.fiadoresPesquisar = fiadoresPesquisar;
    }

    
    public String getCodigoProtocolo() {
        return codigoProtocolo;
    }

    public void setCodigoProtocolo(String codigoProtocolo) {
        this.codigoProtocolo = codigoProtocolo;
    }

    public Pessoa getDevedor() {
        return devedor;
    }

    public void setDevedor(Pessoa devedor) {
        this.devedor = devedor;
    }

    public Pessoa getDevedorCadastrar() {
        return devedorCadastrar;
    }

    public void setDevedorCadastrar(Pessoa devedorCadastrar) {
        this.devedorCadastrar = devedorCadastrar;
    }

    public Pessoa getDevedorPesquisar() {
        return devedorPesquisar;
    }

    public void setDevedorPesquisar(Pessoa devedorPesquisar) {
        this.devedorPesquisar = devedorPesquisar;
    }

    public Pessoa getDevedorSelecionado() {
        return devedorSelecionado;
    }

    public void setDevedorSelecionado(Pessoa devedorSelecionado) {
        this.devedorSelecionado = devedorSelecionado;
    }

    public Pessoa getApresentanteCadastrar() {
        return apresentanteCadastrar;
    }

    public void setApresentanteCadastrar(Pessoa apresentanteCadastrar) {
        this.apresentanteCadastrar = apresentanteCadastrar;
    }

    public Pessoa getApresentanteSelecionado() {
        return apresentanteSelecionado;
    }

    public void setApresentanteSelecionado(Pessoa apresentanteSelecionado) {
        this.apresentanteSelecionado = apresentanteSelecionado;
    }

    public List<Pessoa> getApresentantesPesquisar() {
        return apresentantesPesquisar;
    }

    public void setApresentantesPesquisar(List<Pessoa> apresentantesPesquisar) {
        this.apresentantesPesquisar = apresentantesPesquisar;
    }

    public List<Pessoa> getApresentantes() {
        return apresentantes;
    }

    public void setApresentantes(List<Pessoa> apresentantes) {
        this.apresentantes = apresentantes;
    }

    public Pessoa getApresentante() {
        return apresentante;
    }

    public void setApresentante(Pessoa apresentante) {
        this.apresentante = apresentante;
    }

    public Protesto getProtesto() {
        return protesto;
    }

    public void setProtesto(Protesto protesto) {
        this.protesto = protesto;
    }

    public ProtestoServico getProtestoServico() {
        return protestoServico;
    }

    public void setProtestoServico(ProtestoServico protestoServico) {
        this.protestoServico = protestoServico;
    }

    public Protocolo getProtocolo() {
        return protocolo;
    }

    public void setProtocolo(Protocolo protocolo) {
        this.protocolo = protocolo;
    }

    public ProtocoloItem getProtocoloItem() {
        return protocoloItem;
    }

    public void setProtocoloItem(ProtocoloItem protocoloItem) {
        this.protocoloItem = protocoloItem;
    }

    public List<Pessoa> getDevedores() {
        return devedores;
    }

    public void setDevedores(List<Pessoa> devedores) {
        this.devedores = devedores;
    }

    public Pessoa getApresentantePesquisar() {
        return apresentantePesquisar;
    }

    public void setApresentantePesquisar(Pessoa apresentantePesquisar) {
        this.apresentantePesquisar = apresentantePesquisar;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public List<Pessoa> getDevedoresPesquisar() {
        return devedoresPesquisar;
    }

    public void setDevedoresPesquisar(List<Pessoa> devedoresPesquisar) {
        this.devedoresPesquisar = devedoresPesquisar;
    }

    // kdfsf
    public void limparApresentante() {
        this.apresentante.setNome(null);
        this.apresentante.setCpf(null);
        this.apresentante.setCnpj(null);
    }

    public void limparDevedor() {
        this.devedor.setNome(null);
        this.devedor.setCpf(null);
        this.devedor.setCnpj(null);
    }
    
    public void limparFiador() {
        this.fiador.setNome(null);
        this.fiador.setCpf(null);
        this.fiador.setCnpj(null);
    }

    public void pesquisarApresentante() {
        this.apresentantesPesquisar = pessoaServico.pesquisarCliente(this.apresentantePesquisar);
    }

    public void pesquisarDevedor() {
        this.devedoresPesquisar = pessoaServico.pesquisarCliente(this.devedorPesquisar);
    }
    
    public void pesquisarFiador() {
        this.fiadoresPesquisar = pessoaServico.pesquisarCliente(this.fiadorPesquisar);
    }

    public void selecionarApresentante() {
        this.apresentantes.add(this.apresentanteSelecionado);

        instanciarApresentantePesquisar();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dialogApresentante.hide();");
    }

    public void selecionarDevedor() {
        this.devedores.add(this.devedorSelecionado);

        instanciarDevedorPesquisar();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dialogDevedor.hide();");
    }
    
    public void selecionarFiador() {
        this.fiadores.add(this.fiadorSelecionado);

        instanciarFiadorPesquisar();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dialogFiador.hide();");
    }

    public void instanciarApresentantePesquisar() {
        this.apresentantePesquisar = new Pessoa();
        this.apresentantePesquisar.setTipoPessoa(TipoPessoa.FISICA);

        this.apresentanteSelecionado = new Pessoa();

        this.apresentantesPesquisar = new ArrayList<Pessoa>();
    }

    public void instanciarDevedorPesquisar() {
        this.devedorPesquisar = new Pessoa();
        this.devedorPesquisar.setTipoPessoa(TipoPessoa.FISICA);

        this.devedorSelecionado = new Pessoa();

        this.devedoresPesquisar = new ArrayList<Pessoa>();
    }
    
    public void instanciarFiadorPesquisar() {
        this.fiadorPesquisar = new Pessoa();
        this.fiadorPesquisar.setTipoPessoa(TipoPessoa.FISICA);

        this.fiadorSelecionado = new Pessoa();

        this.fiadoresPesquisar = new ArrayList<Pessoa>();
    }

    public void instanciarApresentanteCadastrar() {
        this.apresentanteCadastrar = new Pessoa();
        this.apresentanteCadastrar.setSexo(Sexo.FEMININO);
        this.apresentanteCadastrar.setTipoPessoa(TipoPessoa.FISICA);
        this.endereco = new Endereco();
        this.apresentanteCadastrar.setEndereco(this.endereco);
    }

    public void instanciarDevedorCadastrar() {
        this.devedorCadastrar = new Pessoa();
        this.devedorCadastrar.setSexo(Sexo.FEMININO);
        this.devedorCadastrar.setTipoPessoa(TipoPessoa.FISICA);
        this.enderecoDevedor = new Endereco();
        this.devedorCadastrar.setEndereco(this.enderecoDevedor);
    }

    public List<SelectItem> estadosCivis() {
        List<SelectItem> itens = new ArrayList<SelectItem>();
        itens.add(new SelectItem("", ""));
        for (EstadoCivil estado : EstadoCivil.values()) {
            itens.add(new SelectItem(estado, estado.getNome()));
        }
        return itens;
    }

    public void salvarApresentante() {
        this.apresentanteCadastrar.setCategoriaPessoa(CategoriaPessoa.CLIENTE);

        if (this.apresentanteCadastrar.getTipoPessoa() == TipoPessoa.FISICA) {
            this.apresentanteCadastrar.setCpf(Caracteres.removecaracter(this.apresentanteCadastrar.getCpf()));
        } else {
            this.apresentanteCadastrar.setCnpj(Caracteres.removecaracter(this.apresentanteCadastrar.getCnpj()));
        }

        this.apresentanteCadastrar.getEndereco().setCep(Caracteres.removecaracter(this.apresentanteCadastrar.getEndereco().getCep()));

        pessoaServico.salvar(this.apresentanteCadastrar);

        this.apresentantes.add(this.apresentanteCadastrar);

        instanciarApresentanteCadastrar();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dialogApresentante.hide();");
    }

    public void salvarDevedor() {
        this.devedorCadastrar.setCategoriaPessoa(CategoriaPessoa.CLIENTE);

        if (this.devedorCadastrar.getTipoPessoa() == TipoPessoa.FISICA) {
            this.devedorCadastrar.setCpf(Caracteres.removecaracter(this.devedorCadastrar.getCpf()));
        } else {
            this.devedorCadastrar.setCnpj(Caracteres.removecaracter(this.devedorCadastrar.getCnpj()));
        }

        this.devedorCadastrar.getEndereco().setCep(Caracteres.removecaracter(this.devedorCadastrar.getEndereco().getCep()));

        pessoaServico.salvar(this.devedorCadastrar);

        this.devedores.add(this.devedorCadastrar);

        instanciarDevedorPesquisar();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dialogDevedor.hide();");
    }

    public void salvar() {
        try {
            this.protesto.setDevedor(devedores);
            this.protesto.setAvalistas(fiadores);
            if (apresentantes != null && !apresentantes.isEmpty()) {
                this.protesto.setApresentante(apresentantes.get(0));
            }
            this.protesto.setProtocolo(protocolo);
            this.protesto.setProtocoloItem(protocoloItem);
            this.protesto.setCodigoProtocolo(codigoProtocolo);
            if (protesto.getId() == null) {
                this.protesto.setDataProtesto(new Date());
                this.protestoServico.salvar(protesto);
                this.situacaoProtesto.setTipoSituacaoProtesto(TipoSituacaoProtesto.CADASTRADO);
                salvarSituacaoProtesto(false);
            } else {
                this.protestoServico.atualizar(protesto);
            }
            Mensagem.messagemInfo();
        } catch (Exception e) {
            e.printStackTrace();
            Mensagem.messagemError();
        }
    }

    public void salvarSituacaoProtesto(boolean msg) {
        //CRIANDO A SITUAÇÃO INICIAL
        
        this.situacaoProtesto.setDataCriacao(new Date());
        //TODO COLOCAR USUÁRIO
        this.situacaoProtesto.setUsuario(null);
        this.situacaoProtesto.setProtesto(this.protesto);
        situacaoProtestoServico.salvar(this.situacaoProtesto);
        
        if(msg){
            Mensagem.messagemInfo();
        }
    }

    public void loadProtocolo() {
        String[] protocolos = codigoProtocolo.split("\\.");

        //PROTOCOLO
        protocolo = protocoloServico.pesquisar(Long.parseLong(protocolos[0]));
        if (protocolo == null) {
            Mensagem.messagemWarn("Protocolo não encontrado");
        } else {
            //PROTOCOLO ITEM
            protocoloItem = protocoloServico.obterItens(protocolo).get(Integer.parseInt(protocolos[1]) - 1);
        }


    }

    public boolean isVisualizar() {
        return visualizar;
    }

    public void setVisualizar(boolean visualizar) {
        this.visualizar = visualizar;
    }

    public List<SituacaoProtesto> getSituacoesProtesto() {
        return situacoesProtesto;
    }

    public void setSituacoesProtesto(List<SituacaoProtesto> situacoesProtesto) {
        this.situacoesProtesto = situacoesProtesto;
    }

    private TipoSituacaoProtesto getPorCodigoTipoSituacaoProtesto(Integer cod) {

        switch (cod) {
            case 1:
                return TipoSituacaoProtesto.CANCELAR_PROTESTO;
            case 2:
                return TipoSituacaoProtesto.SUSPENDER_PROTESTO;
            case 3:
                return TipoSituacaoProtesto.REVOGAR_CANCELAMENTO;
            case 4:
                return TipoSituacaoProtesto.REVOGAR_SUSPENSAO;
            case 5:
                return TipoSituacaoProtesto.EMITIR_CARTA;
            case 6:
                return TipoSituacaoProtesto.CADASTRADO;
            case 7:
                return TipoSituacaoProtesto.DEVEDOR_COMUNICADO;
            case 8:
                return TipoSituacaoProtesto.COMUNICADO_REALIZADO;
            case 9:
                return TipoSituacaoProtesto.NAO_LOCALIZADO;
            case 10:
                return TipoSituacaoProtesto.PROTESTADO;
            case 11:
                return TipoSituacaoProtesto.ENVIADO_PROTECAO_CREDITO;
        }
        return null;
    }

    public SituacaoProtesto getSituacaoProtesto() {
        return situacaoProtesto;
    }

    public void setSituacaoProtesto(SituacaoProtesto situacaoProtesto) {
        this.situacaoProtesto = situacaoProtesto;
    }
    
    public void emitirBoleto(){
        protestoServico.emitirBoleto();
    }
    
    public void emitirIntimacao(){
        protestoServico.emitirIntimacao();
    }
    
    public List<EspecieTitulo> autocomplete(String str) {
        return especieTituloServico.autocomplete(str, protesto.getTipoTitulo());
    }
}
